2392. Интересная сумма

 

Дано трёхзначное натуральное число n. Определите сумму наибольшего и наименьшего трёхзначных чисел, которые могут быть образованы из числа n перестановкой цифр.

 

Вход. Натуральное число n (100 ≤ n ≤ 999).

 

Выход. Выведите сумму наибольшего и наименьшего трёхзначных чисел.

 

Пример входа

Пример выхода

524

787

 

 

РЕШЕНИЕ

сортировка

 

Анализ алгоритма

Прочитаем число в символьный массив. Отсортируем цифры по убыванию, получим наибольшее число. Отсортируем цифры по возрастанию, получим наименьшее число. Однако если число в десятичной записи содержало 0, то после сортировки 0 будет в разряде сотен и число не будет трехзначным. Необходимо найти наименьшую цифру, не равную 0, и поставить ее в разряд сотен.

 

Реализация алгоритма

Наименьшее число будем строить в массиве s, наибольшее – в s1.

 

char s[5], s1[5];

 

Считываем входное число в строку s. Скопируем его в строку s1.

 

gets(s); strcpy(s1,s);

 

Отсортируем цифры числа s по возрастанию, а цифры числа s1 по убыванию.

 

sort(s,s+3,less<char>());

sort(s1,s1+3,greater<char>());

 

Если цифра сотен числа s равна 0, то поменяем ее с цифрой десятков (если она ненулевая) или с цифрой единиц для получения наименьшего трехзначного числа.

 

if (s[0] == '0' && s[1] != '0') swap(s[0],s[1]);

if (s[0] == '0' && s[1] == '0') swap(s[0],s[2]);

 

Получаем из строк s и s1 соответственно числа a и b.

 

a = 100*(s[0] - '0') + 10*(s[1] - '0') + s[2] - '0';

b = 100*(s1[0] - '0') + 10*(s1[1] - '0') + s1[2] - '0';

 

Выводим сумму наибольшего и наименьшего трёхзначных чисел.

 

printf("%d\n",a+b);